package com.mopon.springboot.jdbc;

import java.sql.Connection;

import javax.sql.DataSource;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.mopon.spring.boot.redis.EnableRedis;

import redis.clients.jedis.Jedis;

/**
 * 配置DataSource的步骤
 * 1.加入数据库驱动
 * 2.加入配置
 * spring.datasource.driverClassName=com.mysql.jdbc.Driver
 * spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot
 * spring.datasource.username=root
 * spring.datasource.password=root
 * 
 * springboot会自动装配好DataSource，JdbcTemplate，可以直接使用
 * 
 * spring.datasource.type 可以指定数据源的类型
 * 默认支持tomcat,Hikari,Dbcp,Dbcp2 4种数据源
 * 
 * 配置自己的DataSource：
 * 只需要装配一个DataSource到spring容器中即可
 * 
 * 
 * 事务
 * 1.首先要使用@EnableTransactionManagement启用对事务的支持
 * 2.在需要使用事务的方法上面加上@Transactional
 * 注意：默认只会对运行时异常进行事务回滚，非运行时异常不会回滚事务
 * 
 * 
 * 开发一个spring boot starter的步骤
 * 1.新建一个项目
 * 2.需要一个配置类，配置类里面需要装配好需要提供出去的类
 * 3.有2种方式
 * (1)使用@Enable，使用@Import导入需要装配的类
 * (2)/META-INF/spring.factories，在org.springframework.boot.autoconfigure.EnableAutoConfiguration 配置需要装配的类
 * 
 * 
 * springboot默认的日志级别是info
 * 可以通过logging.level.*=debug 来设置，*可以是包，也可以是某个类
 * 日志级别有：TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
 * 日志级别配置成OFF，表示关闭日志输出
 * 
 * logging.file 指定日志文件名字
 * logging.path 指定日志文件目录(此时的日志名字为spring.log)
 * 日志文件输出，文件的大小10M之后，就会自动分割了
 * 
 * logging.pattern.console 配置控制台输出日志的pattern
 * logging.file.console 配置日志文件输出日志的pattern
 * 
 * springboot默认支持logback
 * 也就是说，只需要在classpath下放一个logback.xml，logback-spring.xml的文件，即可定制日志的输出
 * 
 * 使用其它的日志组件的步骤
 * 1.排除掉默认的日志组件：spring-boot-starter-logging
 * 2.加入新的日志组件依赖：spring-boot-starter-log4j2
 * 3.把相应的配置文件放到classpath下
 * 
 * @author galen.zhang
 *
 */
//@EnableRedis
@SpringBootApplication
@EnableTransactionManagement
public class App {

	public static void main(String[] args) throws Exception {
		ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
		DataSource ds = context.getBean(DataSource.class);
		Connection conn = ds.getConnection();
		System.out.println(conn.getCatalog());
		conn.close();
//		context.getBean(ProductDao.class).addProduct("mp3");
//		context.getBean(ProductDao.class).addProductBatch("mp4", "TV");
		System.out.println(ds.getClass());
		
		Jedis jedis = context.getBean(Jedis.class);
		jedis.set("id", "51CTO");
		System.out.println(jedis.get("id"));
		context.close();
	}
}
